/* Agente que caminha pela cenario, para nos pontos de semaforo, se comunica com 
 	um azulzinho para ver se pode ou nao passar */

/* Plans */
	
//esta no ponto de parada e sabe qual azulzinho controla a via
+pos(X,Y,_) :  street_cell(X,Y,stop) & know_controller(Ag,X,Y)
	<- ?at_street(D); 
	my.next_pos(NX, NY, X,Y,D);				//calcula proxima coordenada
	.send(Ag,tell,want_cross(NX,NY,D)).
	
	
//esta no ponto de parada e nao sabe qual azulzinho controla a via
+pos(X,Y,_) : street_cell(X,Y,stop) & not know_controller(Ag,X,Y)
	<- 	?at_street(D);
		my.next_pos(NX, NY, X,Y,D);				//calcula a minha proxima posicao
		.findall(A,coordinator(A),LIST); 		//busca todos os controladores no ambiente
		for (.member(Ag,LIST) ) {
			.send(Ag,askOne,responsable_quad(NX,NY)) //pergunta quem eh o responsavel
     	}.
    
//esta em pontos que nao sao os de parada
+pos(X,Y,_)
	<-	 !move_agent.
	
//nao esta em cruzamento, nem no semaforo, just move
+!move_agent
	<-	?at_street(D); 		//ve qual a direcao da rua
		move(D).
		
//saiu do grid comeca denovo
-!move_agent
	<- .findall(Ag,know_controller(Ag,_,_), LIST);
	?at_street(D);
	for (.member(Ag,LIST) ) {
		-can_cross(D)[source(Ag)];
    }.	 

//descobre quem eh o azulzinho responsavel pela rua
+responsable_quad(NX,NY)[source(A)]
	<- -responsable_quad(NX,NY)[source(A)]; 	//nao precisamos manter essa crenca
	?pos(X,Y,_);
	+know_controller(A,X,Y).					

//resposta do azulzinho autorizando a passagem
+can_cross(D)[source(Ag)]
	<- !move_agent.	//walk again


